package com.mcp.converter.shared.response.xml;

import com.mcp.converter.shared.response.sql.SQLLocation;
import lombok.Data;

import java.util.List;

/**
 * 通用XML解析结果
 * 用于封装各种XML文件（MyBatis、IFP框架等）的解析结果和SQL提取信息
 * @author zengxiong
 */
@Data
public class XMLParseResult {
    /**
     * XML文件路径
     */
    private String xmlPath;
    
    /**
     * SQL位置列表
     */
    private List<SQLLocation> sqlLocations;
    
    /**
     * 命名空间（MyBatis的namespace或IFP的businessLogic id）
     */
    private String namespace;
    
    /**
     * 解析是否成功
     */
    private boolean parseSuccess;
    
    /**
     * 错误信息
     */
    private String errorMessage;
    
    /**
     * 框架类型（mybatis、ifp等）
     */
    private String frameworkType;
    
    /**
     * 提取的SQL语句总数
     */
    private int totalSqlCount;
    
    /**
     * 有效SQL语句数量（通过JSQLParser校验的）
     */
    private int validSqlCount;
    
    /**
     * 无效SQL语句数量
     */
    private int invalidSqlCount;
    
    /**
     * 默认构造函数
     */
    public XMLParseResult() {
        this.parseSuccess = false;
        this.totalSqlCount = 0;
        this.validSqlCount = 0;
        this.invalidSqlCount = 0;
    }
    
    /**
     * 构造函数
     * @param xmlPath XML文件路径
     */
    public XMLParseResult(String xmlPath) {
        this();
        this.xmlPath = xmlPath;
    }
    
    /**
     * 构造函数
     * @param xmlPath XML文件路径
     * @param frameworkType 框架类型
     */
    public XMLParseResult(String xmlPath, String frameworkType) {
        this(xmlPath);
        this.frameworkType = frameworkType;
    }
    
    /**
     * 设置SQL位置列表并更新统计信息
     * @param sqlLocations SQL位置列表
     */
    public void setSqlLocations(List<SQLLocation> sqlLocations) {
        this.sqlLocations = sqlLocations;
        if (sqlLocations != null) {
            this.totalSqlCount = sqlLocations.size();
            // 这里可以根据需要添加SQL有效性检查逻辑
            this.validSqlCount = sqlLocations.size();
            this.invalidSqlCount = 0;
        }
    }
    
    /**
     * 添加SQL位置
     * @param sqlLocation SQL位置信息
     */
    public void addSqlLocation(SQLLocation sqlLocation) {
        if (this.sqlLocations == null) {
            this.sqlLocations = new java.util.ArrayList<>();
        }
        this.sqlLocations.add(sqlLocation);
        this.totalSqlCount = this.sqlLocations.size();
    }
    
    /**
     * 检查是否有SQL语句
     * @return 是否有SQL语句
     */
    public boolean hasSqlStatements() {
        return sqlLocations != null && !sqlLocations.isEmpty();
    }
    
    /**
     * 获取解析摘要信息
     * @return 解析摘要
     */
    public String getSummary() {
        if (!parseSuccess) {
            return String.format("解析失败: %s", errorMessage);
        }
        
        return String.format("解析成功，提取到 %d 个SQL语句（有效: %d，无效: %d）", 
                           totalSqlCount, validSqlCount, invalidSqlCount);
    }
    
    /**
     * 创建MyBatis类型的解析结果
     * @param xmlPath XML文件路径
     * @return XMLParseResult实例
     */
    public static XMLParseResult forMyBatis(String xmlPath) {
        return new XMLParseResult(xmlPath, "mybatis");
    }
    
    /**
     * 创建IFP类型的解析结果
     * @param xmlPath XML文件路径
     * @return XMLParseResult实例
     */
    public static XMLParseResult forIfp(String xmlPath) {
        return new XMLParseResult(xmlPath, "ifp");
    }
}